
; ==========================================================================
;
; Name:   Nutz_Mickey                                  Micheal Bttner
; Date:   21.2.1994                                    Am Rinkenbhl 146
; System: Sega Megadrive                               64807 Dieburg
; Target: Endgegner fr Nutz                           Tel.: 06071/24469
;
; ==========================================================================

		IFD	Flag_project
Flag_Mickey	Set	1
		ENDC
		IFND	Flag_Mickey
Flag_Mickey	Set	0
		ENDC
		IFEQ	Flag_Mickey
Flag_Mickey	Set	1
		Include	/Nutz_project
		ELSEIF

; ==========================================================================
;
; Definitionen und Daten includen (Work:Sega/Sources/Mr_Nutz/Additional)
;
; ==========================================================================

		Include	Additional/Mickey.Definition.asm
		Include	Additional/Mickey.Data.asm

; ==========================================================================
;
; Initialisierungsphase
;
; a5 = Zeiger auf MainRout-Table
; a6 = Zeiger auf Work-RAM
;
; ==========================================================================

		;Parallax initialisieren
Init_Mickey	cmp	#2,Glo_Level(a6)
		beq	.No_Parallax
		jsr	Init_TekknoParallax
		st	TBalken_Flag(a6)		;Bitte keine zustzlichen Sprites!

		;Adresse fr Block-Definition setzen
.No_Parallax	move.l	#TEKKNO_Block_Entry_Adrs,Scr_Block_EntryAdrs(a6)

		;Font uploaden
		lea	Tekkno_world_bin_p,a0
		move	#260,d0
		jsr	Load_World
		move.l	#Tekkno_Coltab,Base_Coltab(a6)
		lea	Mickey_LoadList(pc),a0
		jsr	Execute_LoadList

		;Adresse fr ColourTable setzen
		move.l	#Tekkno_Coltab,Base_Coltab(a6)
		move.l	#GemVram_Tekkno,GemVramAdrs(a6)

		;Setup (Global) fr VRAM
		moveq	#0,d0
		lea	Mickey_Global_VRam,a1
		lea	Mickey.0_bin_p,a0
		jsr	LoadVRam_crunched

		;Setup (Individual) fr VRAM
		moveq	#0,d0
		lea	Tekkno_EnemyVRam,a1
		move	Glo_Level(a6),d1
		lea	Mickey_World_List,a0
		lsl	#3,d1
		move.l	(a0,d1.w),a0
		jsr	LoadVRam_crunched

		;Alle Tren sind geschloen
		clr	Open_Door_But(a6)

		;Adresse fr Level-Table setzen
		move.l	#Mickey_Level,Glo_Leveltable(a6)

		;Adresse Nutz setzen
		move.w	#Nutz_VRam>>5,TEMET_Prio(a6)

		;Adresse fr Fontne setzen
		move	#(Tekkno_EnemyVRam/32)+138,Boss_VRam(a6)

		;Speziellen Startup-Code aufrufen
		move	Glo_Level(a6),d0
		lea	Mickey_World_List,a0
		lsl	#3,d0
		add.l	LONG(a0,d0.w),a0
		jmp	(a0)

; ==========================================================================

Mickey_LoadList	dc.w	0,Tekkno_ParaVRam
		dc.l	Tekkno_para1_bin_p
		dc.w	352,Tekkno_Para2VRam
		dc.l	Tekkno_para2_raw
		dc.w	512,Tekkno_SpriteVRam
		dc.l	Tekkno_sprite_raw
		dc.w	256,Under_WaterVRam
		dc.l	WATER_raw
		dc.w	-1

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner I (Springer)
;
; ==========================================================================

		;Info fr Objekte setzen
Init_Mickey_00	lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner1_Info-Bob_Info_Start,2*NUM_GEGNER1(a1)
		move	#Bumper1_Info-Bob_Info_Start,2*NUM_BUMPER1(a1)

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Endgegner eintragen
		moveq	#NUM_GEGNER1,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jmp	Search_Bob_Entry

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner II (Gummi)
;
; ==========================================================================

		;Flammen-Routine einfgen
Init_Mickey_01	lea	TEMET_Supervisor,a0
		lea	Display_Flame,a1
		jsr	Insert_Mickey_Main

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Info fr Objekte setzen
		lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner2_Info-Bob_Info_Start,2*NUM_GEGNER(a1)
		move	#Door_Info-Bob_Info_Start,2*NUM_DOOR(a1)
		move	#Button_Info1-Bob_Info_Start,2*NUM_BUTTON1(a1)
		move	#Button_Info2-Bob_Info_Start,2*NUM_BUTTON2(a1)
		move	#Button_Info3-Bob_Info_Start,2*NUM_BUTTON3(a1)

		;Endgegner eintragen
		moveq	#NUM_GEGNER,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jmp	Search_Bob_Entry

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner III (Wasser)
;
; ==========================================================================

		;Prioritt Playfield A lschen
Init_Mickey_02	lea	Scr_Macros(a6),a0
		move	#260*4-1,d0
.Loop_Prioritt	and	#%0111111111111111,(a0)+
		dbf	d0,.Loop_Prioritt

		;Playfield B lschen
		move.l	#%01<<30!$c>>2,$c00004
		move	#64*32-1,d0
		moveq	#0,d1
.Loop_Clear	move	d1,$c00000
		dbf	d0,.Loop_Clear

		;Info fr Objekte setzen
		lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner3_Info-Bob_Info_Start,2*NUM_GEGNER(a1)
		move	#WBumper1_Info-Bob_Info_Start,2*NUM_BUTTON1(a1)
		move	#SM_MOV_W_NOTHING_I-Bob_Info_Start,2*NUM_BUTTON2(a1)
		move	#ST_FONTNE_I-Bob_Info_Start,2*ST_FONTNE(a1)

		;Kein unten rausfallen
		st	Y_Dead_Allowed(a6)

		;Wasser initialiseren
		move.w	#5*64,UnderWaterMax(a6)
		move.w	#6,UnderWaterShift(a6)
		move.w	#0,UnderWaterTest(a6)

		;Endgegner eintragen
		moveq	#NUM_GEGNER,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jsr	Search_Bob_Entry

		;Wasser initialisieren
		jmp	Init_TekknoWaterParallax

; ==========================================================================
;
; VSRAM und Scroll-RAM im VBL setzen
;
; ==========================================================================

Platsch_VSRAM	movem.l	d0/a0,-(sp)
		lea	Platsch_Struktur,a0
		tst	Platsch_Hit_Timer(a0)
		beq	.Normal
		subq	#1,Platsch_Hit_Timer(a0)
		eor	#1,Platsch_Hit_Flag(a0)
		beq	.Normal
		move	#$8407,$c00004
		move.l	#$40000000+$30020003,$c00004
		move	Scr_X_Level_Pos(a6),$c00000
		move.l	#$40000010+$00020000,$c00004
		move	Scr_Y_Level_Pos(a6),$c00000
		bra	.Done
.Normal		move	#$8406,$c00004
		move.l	#$40000010+$00020000,$c00004
		move	Platsch_Y(a0),d0
		sub	Scr_Y_Level_Pos(a6),d0
		sub	Platsch_Y_Flag(a0),d0
		and	#%0000000000000111,d0
		eor	#%0000000000000111,d0
		sub	Platsch_Y_Flag(a0),d0
		addq	#8,d0
		move	d0,$c00000
		move.l	#$40000000+$30020003,$c00004
		move	Platsch_X(a0),d0
		sub	Scr_X_Level_Pos(a6),d0
		sub	Platsch_X_Flag(a0),d0
		and	#%0000000000000111,d0
		subq	#8,d0
		move	d0,$c00000
.Done		movem.l	(sp)+,d0/a0
		rts

Platsch_VSRAM_Dark	bsr	Platsch_VSRAM
		jmp	TSet_Dark_Color
Platsch_VSRAM_Light	bsr	Platsch_VSRAM
		jmp	Set_Nothing

; ==========================================================================
;
; Initialiserungs-Routine fr den Gegner
;
; ==========================================================================

		;Platsch-Struktur lschen
Gegner3_Init	lea	Platsch_Struktur,a0
		move	#VARIABLEN3_SIZEOF-Platsch_Struktur-1,d0
		moveq	#0,d1
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		sub	#VARIABLEN3_SIZEOF-Platsch_Struktur,a0

		;Struktur initialisieren
		move	#200,Platsch_X(a0)
		move	#300,Platsch_Y(a0)

		lea	Gegner3_Task_Table,a1
		move.l	a1,Platsch_Task_Zeiger(a0)
		lea	Flame_Table_Gegner3,a1
		move.l	a1,Platsch_Flame_Zeiger(a0)
		lea	Gegner3_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#410,WaterBase(a6)
		rts


; ==========================================================================
;
; Objekt-Handler des Gegners
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================
Check_GlobalRoutMi
		move.l	#Mover_MGlobal_Water,Bob_Routine(a4)
		rts

I_Mover_WaterRout_1_Mi
		*--*>Init Values for MoverYRout
		move.w	#200,Bob_Out_X_Val(a4)
		jsr	Check_GlobalRoutMi
		move.l	#Move_With_Water,Mover_Move_Routine(a4)
		move.b	#121,Mover_X_Wait_Time(a4)
		*--*>Set Mover to WaterY
		clr.b	Mover_Set_To_Water(a4)
		move	Water_YPos(a6),d0
		move	d0,Bob_Y_Position(a4)
		sub	#MOVER_WATER_SUB,Bob_Y_Position(a4)
		*--*>Init Y Offset
		move	#WAIT_JUMP,Mover_Y_Offset(a4)
		*--*>Init Left or Right
		rts

Mover_MGlobal_Water:
		*--*>Global Routs for Mover Water
		lea	WorkRam,a2
		tst.b	Mover_TEMET_On(a4)
		beq.s	.Nothing
		cmp	#MOVER,TEMET_Status(a2)
		beq.s	.Nothing
		clr.b	Mover_TEMET_On(a4)
		;rts
.Nothing
		jsr	Test_Bob_Out
		move.l	Mover_Move_Routine(a4),a0
		jsr	(a0)
		*--*>Test Temet on Top
		move.b	Mover_TEMET_On(a4),d0
		move	d0,-(sp)
		jsr	Test_TEMET_On_Top
		move	(sp)+,d0
		*--*>Test if should Init Y Jump
		tst.b	d0
		beq.s	.TEMET_WAS_NOT_ON
.TEMET_WAS_ON	*--Temet war drauf
		tst.b	Mover_TEMET_On(a4)
		bne.s	.Go_Ende
		move	#WM_JUMP_END,Mover_Y_Offset(a4)
		bra.s	.Go_Ende
.TEMET_WAS_NOT_ON	*--Temet war nicht drauf
		tst.b	Mover_TEMET_On(a4)
		beq.s	.Go_Ende
		move	#WM_JUMP_ANF,Mover_Y_Offset(a4)
.Go_Ende		*--*>Show Mover
		jsr	Show_Mickey_Object
		moveq	#1,d2
		jmp	Show_Mickey_XObject

; ==========================================================================
;
; Objekt-Handler des Gegners
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

Gegner3_Routine	lea	Platsch_Struktur,a0
		tst	Platsch_Hit_Timer(a0)
		beq	.No_Tod_Test
		tst	Platsch_Hit_Tod(a0)
		beq	.No_Tod_Test
		moveq	#1,d0
		jsr	Quit_Game

		;Makro-Sprache ausfhren
.No_Tod_Test	move.l	Platsch_Task_Zeiger(a0),a1
		add	Platsch_Task_Offset(a0),a1
		tst	Platsch_Hit_Tod(a0)
		bne	.Handle_Enemy
		moveq	#0,d0
		move.b	(a1),d0
		cmp.b	#TASK3_WAIT,d0
		beq	.Task_Wait
		cmp.b	#TASK3_XACC,d0
		beq	.Task_XAcc
		cmp.b	#TASK3_BRANCH,d0
		beq	.Task_Branch

		; ============
		; TASK3 - MINE
		; ============

.Task_Mine	lea	Gegner3_MineTable,a3
		move	Platsch_Mine_Offset(a0),d0
		lsl	#3,d0
		add	d0,a3
		cmp	#-1,(a3)
		bne	.Mine_Offset_Ok
		clr	Platsch_Mine_Offset(a0)
		bra	.Task_Mine
.Mine_Offset_Ok	addq	#1,Platsch_Mine_Offset(a0)
		movem	(a3)+,d0/d1
		add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		lea	Mine_Struktur,a2
		moveq	#MINE_MAX-1,d2
.Loop_Search_Mine	tst	Mine_Used(a2)
		bne	.Mine_Used
		move	#1,Mine_Used(a2)
		movem	d0/d1,Mine_X_Position(a2)
		clr	Mine_Expl_Flag(a2)
		clr	Mine_Expl_Offset(a2)
		movem	(a3)+,d0/d1
		movem	d0/d1,Mine_X_Speed(a2)
		moveq	#13,d0
		jsr	TFMX+16
		bra	.Mine_Ok
.Mine_Used	add	#MINE_SIZEOF,a2
		dbf	d2,.Loop_Search_Mine
.Mine_Ok		addq	#1*BYTE,Platsch_Task_Offset(a0)
		bra	.Handle_Enemy

		; ==============
		; TASK3 - BRANCH
		; ==============

.Task_Branch	move.b	1*BYTE(a1),d0
		ext	d0
		add	d0,Platsch_Task_Offset(a0)
		bra	.Handle_Enemy

		; ============
		; TASK3 - XACC
		; ============

.Task_XAcc	move.b	1*BYTE(a1),d0
		ext	d0
		move	d0,Platsch_X_Acc(a0)
		moveq	#0,d0
		move.b	2*BYTE(a1),d0
		move	d0,Platsch_X_AccTimer(a0)
		addq	#3*BYTE,Platsch_Task_Offset(a0)
		bra	.Handle_Enemy

		; ============
		; TASK3 - WAIT
		; ============

.Task_Wait	tst	Platsch_Wait_Timer(a0)
		bne	.Wait_Countdown
		move.b	1*BYTE(a1),d0
		move	d0,Platsch_Wait_Timer(a0)
		bra	.Handle_Enemy
.Wait_Countdown	subq	#1,Platsch_Wait_Timer(a0)
		bne	.Handle_Enemy
		addq	#2*BYTE,Platsch_Task_Offset(a0)

		; ================
		; GEGNER VERWALTEN
		; ================

		;Horizontale Bewegung verwalten
.Handle_Enemy	tst	Platsch_X_AccTimer(a0)
		beq	.X_Bremsen
		subq	#1,Platsch_X_AccTimer(a0)
		move	Platsch_X_Acc(a0),d0
		add	d0,Platsch_X_Speed(a0)
		bra	.X_Speed_Ok
.X_Bremsen	tst	Platsch_X_Speed(a0)
		bpl	.X_Positiv
.X_Negativ	add	#PLATSCH_BRAKE,Platsch_X_Speed(a0)
		bmi	.X_Speed_Ok
.X_Clear		clr	Platsch_X_Speed(a0)
		bra	.X_Speed_Ok
.X_Positiv	sub	#PLATSCH_BRAKE,Platsch_X_Speed(a0)
		bmi	.X_Clear

		;Range beachten
.X_Speed_Ok	cmp	#PLATSCH_X_MIN,Platsch_X(a0)
		bhs	.Min_Ok
		add	#PLATSCH_REVERSE,Platsch_X_Speed(a0)
.Min_Ok		cmp	#PLATSCH_X_MAX,Platsch_X(a0)
		bls	.Max_Ok
		sub	#PLATSCH_REVERSE,Platsch_X_Speed(a0)
.Max_Ok		move	Platsch_X_Speed(a0),d0
		add	d0,Platsch_X_Float(a0)
		move.b	Platsch_X_Float(a0),d0
		ext	d0
		add	d0,Platsch_X(a0)
		clr.b	Platsch_X_Float(a0)

		;Langsames Beschleunigen, wenn aus Wasser
		tst	Platsch_Slow_Timer(a0)
		beq	.Kein_Slow
		subq	#1,Platsch_Slow_Timer(a0)
		bne	.Kein_Slow
		move	#PLATSCH_GAS_ACC,Platsch_Y_Acc(a0)
		move	#PLATSCH_GAS_TIME,Platsch_Y_AccTimer(a0)
		bra	.Y_Speed_Ok

		;Auf Wasseroberflche liegen
.Kein_Slow	tst	Platsch_Objekt_Timer(a0)
		beq	.Kein_Liegen
		subq	#1,Platsch_Objekt_Timer(a0)
		bne	.Kein_Gas_geben
		move	#PLATSCH_SLOW_ACC,Platsch_Y_Acc(a0)
		move	#PLATSCH_SLOW_TIME,Platsch_Y_AccTimer(a0)
		move	#PLATSCH_SLOW_TIME,Platsch_Slow_Timer(a0)
.Kein_Gas_geben	move	Platsch_Y(a0),d0
		moveq	#0,d1
		move	Water_YPos(a6),d2
		sub	#40,d2
		tst	Platsch_Hit_Tod(a0)
		beq	.Nicht_Tod
		add	#80,d2
		move	#10,Platsch_Objekt_Timer(a0)
.Nicht_Tod	moveq	#0,d3
		bsr	Approach_to_Point
		move	d0,Platsch_Y(a0)
		bra	.Y_Speed_Ok

		;Falls Objekt noch in der Luft, wirkt 
		;die Erdanziehungskraft!

.Kein_Liegen	move	Platsch_Y(a0),d0
		move	Water_YPos(a6),d1
		sub	#80,d1
		sub	d1,d0
		bpl	.Eingetaucht
		add	#PLATSCH_FALL,Platsch_Y_Speed(a0)
		bra	.Y_Speed_Ok

		;Objekt ist auf die Wasseroberflche
		;aufgeschlagen und bremst nun degressiv
		;bis NULL ab!

.Eingetaucht	tst	Platsch_Y_AccTimer(a0)
		bne	.Y_Speed_Ok
		tst	Platsch_Water_Flag(a0)
		bne	.Kein_Wassereffekt
		tst	Platsch_Y_Speed(a0)
		beq	.Kein_Wassereffekt
		move	#1,Platsch_Water_Flag(a0)
		clr	Platsch_Water_Offset(a0)
		move	WaterBase(a6),Platsch_Water_Base(a0)
.Kein_Wassereffekt	moveq	#0,d1
		move	Platsch_Y_Speed(a0),d1
		mulu	#PLATSCH_SINKPROZ,d1
		divu	#100,d1
		sub	d1,Platsch_Y_Speed(a0)
		cmp	#16,Platsch_Y_Speed(a0)
		bhi	.Y_Speed_Ok
		clr	Platsch_Y_Speed(a0)
.Get_Time		lea	Gegner3_WaitTable,a1
		add	Platsch_Objekt_Offset(a0),a1
		move	(a1),d0
		bpl	.Time_Ok
		clr	Platsch_Objekt_Offset(a0)
		bra	.Get_Time
.Time_Ok		move	d0,Platsch_Objekt_Timer(a0)
		addq	#WORD,Platsch_Objekt_Offset(a0)

		;Vertikalen Speed verrechnen
.Y_Speed_Ok	clr	Platsch_Flame_Flag(a0)
		tst	Platsch_Y_AccTimer(a0)
		beq	.Y_Time_Ok
		move	#1,Platsch_Flame_Flag(a0)
		subq	#1,Platsch_Y_AccTimer(a0)
		move	Platsch_Y_Acc(a0),d0
		add	d0,Platsch_Y_Speed(a0)
.Y_Time_Ok	move	Platsch_Y_Speed(a0),d0
		move	Platsch_Y(a0),d1
		move	Water_YPos(a6),d2
		sub	#50,d2
		sub	d2,d1
		bmi	.Nicht_unter_Wasser
		asr	#1,d0
.Nicht_unter_Wasser	add	d0,Platsch_Y_Float(a0)
		move.b	Platsch_Y_Float(a0),d0
		ext	d0
		add	d0,Platsch_Y(a0)
		clr.b	Platsch_Y_Float(a0)

		;Wasser-Effekt ???
		tst	Platsch_Water_Flag(a0)
		beq	.Copy_Position
		lea	Gegner3_WaterTable,a1
		add	Platsch_Water_Offset(a0),a1
		moveq	#0,d0
		move.b	(a1),d0
		cmp.b	#$7f,d0
		bne	.Water_Ok
		clr	Platsch_Water_Flag(a0)
		bra	.Copy_Position
.Water_Ok		ext	d0
		add	Platsch_Water_Base(a0),d0
		move	d0,WaterBase(a6)
		addq	#BYTE,Platsch_Water_Offset(a0)

		;Position bertragen
.Copy_Position	move	Platsch_X(a0),Bob_X_Position(a4)
		move	Platsch_Y(a0),Bob_Y_Position(a4)

		;Hit-Routinen
		movem.l	d0-d7/a0-a6,-(sp)		;Wurde Nutz getroffen ???
		tst	Platsch_Hit_Timer(a0)
		bne	.No_TopBob
		lea	WorkRam,a2
		moveq	#0,d0
		move.b	TEMET_ANZ_HitPoints(a2),d0
		move	d0,-(sp)
		jsr	Test_TEMET_Hit
		move	(sp)+,d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		bls	.No_Scream
		moveq	#23,d0
		jsr	TFMX+16
.No_Scream	lea	WorkRam,a2		;Hat Nutz getroffen ???
		cmp	#2,TEMET_Shield_Flag(a2)
		bne	.No_TopBob
		jsr	KollTopBobTest
		tst	d7
		bmi	.No_TopBob
		moveq	#9,d0
		jsr	TFMX+16
		jsr	Make_Bump
		lea	Platsch_Struktur,a0
		move	#75,Platsch_Hit_Timer(a0)
		clr	Platsch_Hit_Flag(a0)
		addq	#1,Platsch_Hit_Anzahl(a0)
		cmp	#HITS_WATER,Platsch_Hit_Anzahl(a0)
		blo	.No_TopBob
		moveq	#22,d0
		jsr	TFMX+16
		move	#300,Platsch_Hit_Timer(a0)
		move	#1,Platsch_Hit_Tod(a0)
.No_TopBob	movem.l	(sp)+,d0-d7/a0-a6

		;Handle Minen
		lea	Mine_Struktur,a1
		moveq	#MINE_MAX-1,d2
.Loop_Handle_Mine	tst	Mine_Used(a1)
		beq	.No_Mine

		tst	Mine_Expl_Flag(a1)
		beq	.No_Mine_Expl
		subq	#1,Mine_Expl_Timer(a1)
		bpl	.No_Mine
		move	#3,Mine_Expl_Timer(a1)
		addq	#1,Mine_Expl_Offset(a1)
		cmp	#5,Mine_Expl_Offset(a1)
		blo	.No_Mine
		clr	Mine_Used(a1)
		bra	.No_Mine

.No_Mine_Expl	move	Mine_X_Speed(a1),d0
		add	d0,Mine_X_Float(a1)
		move.b	Mine_X_Float(a1),d0
		ext	d0
		add	d0,Mine_X_Position(a1)
		clr.b	Mine_X_Float(a1)
		move	Mine_Y_Speed(a1),d0
		add	d0,Mine_Y_Float(a1)
		move.b	Mine_Y_Float(a1),d0
		ext	d0
		add	d0,Mine_Y_Position(a1)
		clr.b	Mine_Y_Float(a1)
		tst	Mine_X_Speed(a1)
		bpl	.Mine_X_Sub
.Mine_X_Add	add	#20,Mine_X_Speed(a1)
		bmi	.Mine_X_Ok
		clr	Mine_X_Speed(a1)
		bra	.Mine_X_Ok
.Mine_X_Sub	sub	#20,Mine_X_Speed(a1)
		bpl	.Mine_X_Ok
		clr	Mine_X_Speed(a1)
.Mine_X_Ok	cmp	#PLATSCH_LINKS,Mine_X_Position(a1)
		bhs	.Mine_Links_Ok
		add	#2,Mine_X_Position(a1)
		neg	Mine_X_Speed(a1)
.Mine_Links_Ok	cmp	#PLATSCH_RECHTS,Mine_X_Position(a1)
		bls	.Mine_Rechts_Ok
		sub	#2,Mine_X_Position(a1)
		neg	Mine_X_Speed(a1)
.Mine_Rechts_Ok	add	#50,Mine_Y_Speed(a1)
		move	Mine_Y_Position(a1),d0
		add	#16,d0
		cmp	Water_YPos(a6),d0
		bls	.No_Mine
		movem.l	d0-d7/a0-a5,-(sp)
		move	Bob_X_Position(a4),-(sp)
		move	Mine_X_Position(a1),Bob_X_Position(a4)
		sub	#8,Bob_X_Position(a4)
		moveq	#11,d0
		jsr	TFMX+16
		jsr	Init_Fontne
		move	(sp)+,Bob_X_Position(a4)
		movem.l	(sp)+,d0-d7/a0-a5
		move	#1,Mine_Expl_Flag(a1)
		move	#3,Mine_Expl_Timer(a1)
.No_Mine		add	#MINE_SIZEOF,a1
		dbf	d2,.Loop_Handle_Mine

		;Display Minen
.Display_Mine	movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	Mine_Struktur,a1
		moveq	#MINE_MAX-1,d7
.Loop_Mine	tst	Mine_Used(a1)
		beq	.Unused_Mine
		movem	Mine_X_Position(a1),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		movem.l	d7/a0-a3,-(sp)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		tst	Mine_Expl_Flag(a1)
		beq	.Normale_Mine_Gfx
		lea	Expl_Sigel_List,a0
		move	Mine_Expl_Offset(a1),d7
		lsl	#4,d7
		add	d7,a0
		bra	.Show_Mine
.Normale_Mine_Gfx	lea	Gegner3.1_Sigel,a0
.Show_Mine	jsr	Show_Simple_Mickey
		movem.l	(sp)+,d7/a0-a3
.Unused_Mine	add	#MINE_SIZEOF,a1
		dbf	d7,.Loop_Mine
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Handle Flammen
		lea	Flame3_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Handle	tst	Flame_Used(a1)
		beq	.No_Flame
		move	Flame_Speed(a1),d0
		add	d0,Flame_Float(a1)
		move.b	Flame_Float(a1),d0
		ext	d0
		add	d0,Flame_Y_Position(a1)
		clr.b	Flame_Float(a1)
		sub	#16,Flame_Speed(a1)
		bpl	.Speed_Ok
		clr	Flame_Speed(a1)
.Speed_Ok		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#8,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)

		;Bubble fr Flamme eintragen
		move.l	a0,-(sp)
		lea	MBubble_Struktur,a0
		moveq	#MBUBBLE_MAX-1,d0
.Loop_Src_MBubble	tst	MBubble_Used(a0)
		bne	.MBubble_is_used
		move	#1,MBubble_Used(a0)
		move	Flame_X_Position(a1),MBubble_X_Position(a0)
		move	Flame_Y_Position(a1),MBubble_Y_Position(a0)
		move	#-136,MBubble_Y_Speed(a0)
		clr	MBubble_Timer(a0)
		clr	MBubble_Offset(a0)
		bra	.MBubble_Ok
.MBubble_is_used	add	#MBUBBLE_SIZEOF,a0
		dbf	d0,.Loop_Src_MBubble
.MBubble_Ok	move.l	(sp)+,a0

.No_Flame		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Handle

		;Neue Flammen ???
		tst	Platsch_Flame_Flag(a0)
		beq	.Keine_Flamme
		subq	#1,Platsch_Flame_Timer(a0)
		bpl	.Keine_Flamme
		move.l	Platsch_Flame_Zeiger(a0),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Platsch_Flame_Timer(a0)
		moveq	#0,d3
		move.b	(a1)+,d3
		lsl	#6,d3
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Platsch_Flame_Zeiger(a0)

		;Ja, also eintragen
		add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		lea	Flame3_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search	tst	Flame_Used(a1)
		bne	.Used
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	d3,Flame_Speed(a1)
		clr	Flame_Float(a1)
		move	#3,Flame_Timer(a1)
		moveq	#2,d0
		jsr	TFMX+16
		bra	.Keine_Flamme
.Used		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search

		;Display Flammen
.Keine_Flamme	movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	Flame3_Struktur,a0
		moveq	#FLAME_MAX-1,d7
.Loop_Flame	tst	Flame_Used(a0)
		beq	.Unused
		movem	Flame_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a3,-(sp)
		eor	#1,Flame_Frame(a0)
		beq	.No_Interlace
		add	#22,Bob_Y_Position(a4)
.No_Interlace	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Flame_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
.Ok		movem.l	(sp)+,d7/a0-a3
.Unused		add	#FLAME_SIZEOF,a0
		dbf	d7,.Loop_Flame
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Handle Bubbles
		lea	MBubble_Struktur,a1
		moveq	#MBUBBLE_MAX-1,d2
		move	Water_YPos(a6),d1
		sub	#16,d1
.Loop_Handle_Bubble	tst	MBubble_Used(a1)
		beq	.No_Bubble
		subq	#1,MBubble_BlubTimer(a1)
		bpl	.No_Blub
		move	#50,MBubble_BlubTimer(a1)
		moveq	#6,d0
		jsr	TFMX+16
.No_Blub		move	MBubble_Y_Speed(a1),d0
		add	d0,MBubble_Y_Float(a1)
		move.b	MBubble_Y_Float(a1),d0
		ext	d0
		add	d0,MBubble_Y_Position(a1)
		clr.b	MBubble_Y_Float(a1)
		lea	Bubble_Vert_4,a2
		add	MBubble_Offset(a1),a2
		move.b	(a2),d0
		ext	d0
		add	d0,MBubble_X_Position(a1)
		addq	#1,MBubble_Offset(a1)
		cmp	#324,MBubble_Offset(a1)
		blo	.MOffset_Ok
		clr	MBubble_Offset(a1)
.MOffset_Ok	subq	#1,MBubble_Timer(a1)
		bpl	.MBubble_Positiv
		move	#8,MBubble_Timer(a1)
		eor	#1,MBubble_Anim(a1)
.MBubble_Positiv	cmp	MBubble_Y_Position(a1),d1
		blo	.No_Bubble
		clr	MBubble_Used(a1)
.No_Bubble	add	#MBUBBLE_SIZEOF,a1
		dbf	d2,.Loop_Handle_Bubble

		;Display Bubbles
		movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	MBubble_Struktur,a0
		moveq	#MBUBBLE_MAX-1,d7
.Loop_MBubbles	tst	MBubble_Used(a0)
		beq	.Unused_MBubble
		movem	MBubble_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a3,-(sp)
		tst	MBubble_Anim(a0)
		beq	.MBubble_Anim_NULL
		lea	MBubble_Sigel2,a0
		bra	.Show_MBubble
.MBubble_Anim_NULL	lea	MBubble_Sigel1,a0
.Show_MBubble	jsr	Show_Simple_Mickey
		movem.l	(sp)+,d7/a0-a3
.Unused_MBubble	add	#MBUBBLE_SIZEOF,a0
		dbf	d7,.Loop_MBubbles
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Hole Zeiger auf Base-VRAM und Map
		lea	$c000,a1
		lea	Platsch_Map,a0
		lea	Platsch_Struktur,a2

		;Position und Breite des horizontalen Bereiches berechnen
		clr	Platsch_X_Flag(a2)
		clr	Platsch_Y_Flag(a2)
		moveq	#44,d2
		move	Platsch_X(a2),d0
		sub	Scr_X_Level_Pos(a6),d0
		bpl	.Pos_X
		neg	d0
		move	#1,Platsch_X_Flag(a2)
		lsr	#3,d0
		sub	d0,d2
		beq	.Done
		bmi	.Done
		add	d0,d0
		add	d0,a0
		sub	#WORD,a1
		bra	.Ok_X
.Pos_X		lsr	#3,d0
		sub	d0,d2
		beq	.Done
		bmi	.Done
		add	d0,d0
		add	d0,a1

		;Position und Hhe des vertikalen Bereiches berechnen
.Ok_X		moveq	#30,d3
		moveq	#16,d4
		move	d3,d5
		sub	d4,d5
		move	Platsch_Y(a2),d1
		sub	Scr_Y_Level_Pos(a6),d1
		bpl	.Pos_Y
		neg	d1
		move	#1,Platsch_Y_Flag(a2)
		lsr	#3,d1
		sub	d1,d3
		beq	.Done
		bmi	.Done
		sub	d1,d4
		bmi	.Done
		lsl	#7,d1
		add	d1,a0
		sub	#64*WORD,a1
		bra	.Ok_Y
.Pos_Y		lsr	#3,d1
		sub	d1,d3
		beq	.Done
		bmi	.Done
		cmp	d5,d1
		bls	.No
		move	d1,-(sp)
		sub	d5,d1
		sub	d1,d4
		move	(sp)+,d1
.No		lsl	#7,d1
		add	d1,a1

		;D2 = Breite in Chars
		;D4 = Hhe in Chars

		;Chars in Playfield B kopieren
.Ok_Y		move	d2,d0
		add	d0,d0
		subq	#1,d4
		bmi	.Done
.Loop		movem.l	d0/d4/a0/a1,-(sp)
		jsr	AddDMA
		movem.l	(sp)+,d0/d3/a0/a1
		add	#64*WORD,a0
		add	#64*WORD,a1
		dbf	d4,.Loop
.Done		rts

; ===========================================================================
;
; Approach present Point to final Position
;
; d0 = X-Position of present Point
; d1 = Y-Position of present Point
; d2 = X-Position of final Point
; d3 = Y-Position of final Point
;
; ===========================================================================

Approach_to_Point	movem.l	d2-d7,-(sp)
		moveq	#0,d4
		moveq	#0,d5
		sub	d0,d2
		beq.s	.s1_Done
		addq	#1,d4
		tst	d2
		bpl.s	.s1_Done
		moveq	#-1,d4	;sgn(x2-x1)
		neg	d2	;abs(x2-x1)
.s1_Done		sub	d1,d3
		beq.s	.s2_Done
		addq	#1,d5
		tst	d3
		bpl.s	.s2_Done
		moveq	#-1,d5	;sgn(y2-y1)
		neg	d3	;abs(y2-y1)
.s2_Done		cmp	d3,d2	;if dx < dy then exchange
		bhi.s	.No_Turn
		exg	d3,d2
		move	#1,-(sp)	;t=1
		bra.s	.Turned
.No_Turn		move	#0,-(sp)	;t=0
.Turned		move	d3,d6
		lsl	#1,d6
		sub	d2,d6	;2*dy-dx
		bmi.s	.d_neg
		tst	(sp)
		beq.s	.y_and_s2
		add	d4,d0	;x=x+s1
		bra.s	.d_neg
.y_and_s2		add	d5,d1	;y=y+s2
.d_neg		tst	(sp)+
		bne.s	.y_and_s2_2
		add	d4,d0	;x=x+s1
		bra.s	.Done
.y_and_s2_2	add	d5,d1
.Done		movem.l	(sp)+,d2-d7
		rts

; ==========================================================================
;
; Spezielle Initialisierungen fr Endgegner IV (Lemming)
;
; ==========================================================================

		;Info fr Objekte setzen
Init_Mickey_03	lea	Bob_Info_Tab_Adrs(a6),a1
		move	#Gegner4_Info-Bob_Info_Start,2*NUM_GEGNER4(a1)

		;Endgegner eintragen
		moveq	#NUM_GEGNER4,d0
		moveq	#0,d1
		moveq	#0,d2
		lea	Area_Enter_Vector(a6),a1
		jmp	Search_Bob_Entry

; ==========================================================================
;
; Initialiserungsphase fr den Lemming
;
; ==========================================================================

Gegner4_Init	lea	Lemming_Struktur,a0
		move	#VARIABLEN4_SIZEOF-Lemming_Struktur-1,d0
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		lea	Lemming_Struktur,a0
		move	#100,Lemming_X_Position(a0)
		move	#230,Lemming_Y_Position(a0)
		lea	Task_Tabelle_4,a1
		move.l	a1,Lemming_Task_Zeiger(a0)
		lea	Gegner4_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#550,WaterBase(a6)
		rts

; ==========================================================================
;
; Verwaltungs-Routine fr den Lemming
;
; ==========================================================================

		;Hole Zeiger auf Lemming-Struktur
Gegner4_Routine	lea	Lemming_Struktur,a3

		;Hole neues Kommando
		move.l	Lemming_Task_Zeiger(a3),a0
		add	Lemming_Task_Offset(a3),a0
		move.b	(a0),d0
		cmp.b	#TASK4_ACC,d0
		beq	.Acc
		cmp.b	#TASK4_CLRXACC,d0
		beq	.Clear_X_Acc
		cmp.b	#TASK4_CLRYACC,d0
		beq	.Clear_Y_Acc
		cmp.b	#TASK4_WAIT,d0
		beq	.Wait
		cmp.b	#TASK4_BRANCH,d0
		bne	.Do_Main

		; ========================
		; Bedingungslos verzweigen
		; ========================

.Branch		move.b	1*BYTE(a0),d0
		ext	d0
		add	d0,Lemming_Task_Offset(a3)
		bra	.Do_Main

		; ===============
		; Dumchen drehen
		; ===============

.Wait		tst	Lemming_Timer(a3)
		beq	.Init_Wait
		subq	#1,Lemming_Timer(a3)
		bne	.Do_Main
		addq	#2*BYTE,Lemming_Task_Offset(a3)
		bra	.Do_Main
.Init_Wait	moveq	#0,d0
		move.b	1*BYTE(a0),d0
		move	d0,Lemming_Timer(a3)
		bra	.Do_Main

		; ================================
		; Vertikale Beschleunigung lschen
		; ================================

.Clear_Y_Acc	clr	Lemming_Y_Acc(a3)
		addq	#1*BYTE,Lemming_Task_Offset(a3)
		bra	.Do_Main

		; ==================================
		; Horizontale Beschleunigung lschen
		; ==================================

.Clear_X_Acc	clr	Lemming_X_Acc(a3)
		addq	#1*BYTE,Lemming_Task_Offset(a3)
		bra	.Do_Main

		; ==========================
		; Neue Beschleunigung setzen
		; ==========================

.Acc		move.b	1*BYTE(a0),d0
		beq	.No_X_Acc
		ext	d0
		move	d0,Lemming_X_Acc(a3)
.No_X_Acc		move.b	2*BYTE(a0),d0
		beq	.No_Y_Acc
		ext	d0
		move	d0,Lemming_Y_Acc(a3)
.No_Y_Acc		addq	#3*BYTE,Lemming_Task_Offset(a3)

		;Level-Range beachten
.Do_Main		cmp	#4*16,Lemming_X_Position(a3)
		bge	.Range_XL_Ok
		add	#64,Lemming_X_Speed(a3)
.Range_XL_Ok	cmp	#30*16,Lemming_X_Position(a3)
		blt	.Range_XR_Ok
		sub	#64,Lemming_X_Speed(a3)
.Range_XR_Ok	cmp	#2*16,Lemming_Y_Position(a3)
		bge	.Range_YL_Ok
		add	#64,Lemming_Y_Speed(a3)
.Range_YL_Ok	cmp	#26*16,Lemming_Y_Position(a3)
		blt	.Range_YR_Ok
		sub	#64,Lemming_Y_Speed(a3)

		;Fliekommawerte berechnen
.Range_YR_Ok	move	Lemming_X_Acc(a3),d0
		add	d0,Lemming_X_Speed(a3)
		move	Lemming_X_Speed(a3),d0
		add	d0,Lemming_X_Float(a3)
		move.b	Lemming_X_Float(a3),d0
		ext	d0
		add	d0,Lemming_X_Position(a3)
		clr.b	Lemming_X_Float(a3)
		move	Lemming_Y_Acc(a3),d0
		add	d0,Lemming_Y_Speed(a3)
		move	Lemming_Y_Speed(a3),d0
		add	d0,Lemming_Y_Float(a3)
		move.b	Lemming_Y_Float(a3),d0
		ext	d0
		add	d0,Lemming_Y_Position(a3)
		clr.b	Lemming_Y_Float(a3)

		;bertrage Position
		movem	Lemming_X_Position(a3),d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Display Gegner
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.1_Sigel,a0
		jsr	Show_Simple_Mickey
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.1_Sigel,a0
		add	#75,Bob_X_Position(a4)
		jsr	Show_Simple_Object
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.2_Sigel,a0
		sub	#75,Bob_X_Position(a4)
		add	#3*32,Bob_Y_Position(a4)
		jsr	Show_Simple_Mickey
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Gegner4.2_Sigel,a0
		add	#75,Bob_X_Position(a4)
		jsr	Show_Simple_Object
		sub	#3*32,Bob_Y_Position(a4)
		rts

; ==========================================================================
;
; Initialiserungsphase fr den Springer
;
; ==========================================================================

Gegner1_Init	lea	Jump_Struktur,a0
		move	#VARIABLEN1_SIZEOF-Jump_Struktur-1,d0
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		lea	Jump_Struktur,a0
		move	#LEVEL_MAX,Jump_Level(a0)
		move	#656,Jump_X_Position(a0)
		move	#48,Jump_Gravitation(a0)
		move	#-1,Jump_Flame_Flag(a0)
		move	#0,Jump_Stachel_PosI(a0)
		move	#0,Jump_Stachel_PosS(a0)
		lea	Jump_Stack+STACK_SIZE(a0),a1
		move.l	a1,Jump_Stack_Zeiger(a0)
		lea	Flame_Table_Gegner1,a1
		move.l	a1,Jump_Flame_Zeiger(a0)
		lea	Task_Tabelle,a1
		move.l	a1,Jump_Task_Zeiger(a0)
		lea	Expl_Table_Gummi,a1
		move.l	a1,Jump_Boost_Zeiger(a0)
		lea	Gegner1_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#700,WaterBase(a6)
		rts

; ==========================================================================
;
; Verwaltungs-Routine fr den Springer
;
; ==========================================================================

		;Hole Zeiger auf Jump-Struktur
Gegner1_Routine	lea	Jump_Struktur,a3

		;Stachel Ist/Soll annhern
		move	Jump_Stachel_PosI(a3),d0
		cmp	Jump_Stachel_PosS(a3),d0
		beq	.Stachel_Ok
		blo	.Stachel_Add
		subq	#1,Jump_Stachel_PosI(a3)
		bra	.Stachel_Ok
.Stachel_Add	addq	#1,Jump_Stachel_PosI(a3)

		;Welchen Task ausfhren ???
.Stachel_Ok	move.l	Jump_Task_Zeiger(a3),a1
		add	Jump_Offset(a3),a1
		move.b	(a1),d0
		ext	d0
		move	d0,Jump_Task(a3)
		cmp	#TASK_FALL,d0
		beq	.Fall
		cmp	#TASK_GOTO,d0
		beq	.Goto
		cmp	#TASK_WAIT,d0
		beq	.Wait
		cmp	#TASK_BRANCH,d0
		beq	.Branch
		cmp	#TASK_TABLE,d0
		beq	.Table
		cmp	#TASK_FIRE,d0
		beq	.Fire
		cmp	#TASK_ACC,d0
		beq	.Acc
		cmp	#TASK_AUTO,d0
		beq	.Auto
		cmp	#TASK_MOVE,d0
		beq	.Move
		cmp	#TASK_GOSUB,d0
		beq	.Gosub
		cmp	#TASK_RETURN,d0
		beq	.Return
		cmp	#TASK_JUMP,d0
		beq	.Jump
		cmp	#TASK_WAITMOVE,d0
		beq	.WaitMove
		cmp	#TASK_POSSIBLE,d0
		bne	.Fall

		; ===========================
		; TREFFEN ENABLE/DISABLE
		; ===========================

.Possible		clr	Jump_Stachel_PosS(a3)
		moveq	#0,d0
		move.b	BYTE(a1),d0
		move	d0,Jump_Hit_Possible(a3)
		beq	.Possible_Ok
		move	#30,Jump_Stachel_PosS(a3)
.Possible_Ok	addq	#2*BYTE,Jump_Offset(a3)
		moveq	#1,d0
		jsr	TFMX+16
		bra	.Fall

		; ===========================
		; GEGNER WARTET
		; ===========================

.WaitMove		tst	Jump_Moving_Flag(a3)
		bne	.Fall
		addq	#BYTE,Jump_Offset(a3)
		bra	.Fall

		; ===========================
		; GEGNER HPFT
		; ===========================

.Jump		move.b	BYTE(a1),d0
		ext	d0
		asl	#5,d0
		move	d0,Jump_Y_Speed(a3)
		move	#1,Jump_Jump_Flag(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		moveq	#25,d0
		jsr	TFMX+16
		bra	.Fall

		; ===========================
		; RETURN
		; ===========================

.Return		moveq	#0,d0
		move.l	Jump_Stack_Zeiger(a3),a2
		addq.l	#BYTE,Jump_Stack_Zeiger(a3)
		move.b	(a2),d0
		move	d0,Jump_Offset(a3)
		bra	.Fall

		; ===========================
		; GOSUB
		; ===========================

.Gosub		lea	2*BYTE(a1),a0
		move.l	a0,d0
		sub.l	Jump_Task_Zeiger(a3),d0
		subq.l	#BYTE,Jump_Stack_Zeiger(a3)
		move.l	Jump_Stack_Zeiger(a3),a2
		move.b	d0,(a2)
		bra	.Branch

		; ===========================
		; GEGNER LINKS/RECHTS BEWEGEN
		; ===========================

.Move		moveq	#0,d0
		move.b	1*BYTE(a1),d0
		move	Jump_X_Position(a3),d2
		move	d2,Jump_Moving_Source(a3)
		move.b	2*BYTE(a1),d1
		ext	d1
		bpl	.Move_Acc_Ok
		neg	d0
.Move_Acc_Ok	asl	#4,d1
		add	d1,d2
		move	d2,Jump_Moving_Target(a3)
		move	d0,Jump_Moving_Acc(a3)
		move	#1,Jump_Moving_Flag(a3)
		addq	#3*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ====================
		; AUTOPILOT ANSCHALTEN
		; ====================

.Auto		moveq	#0,d0
		move.b	BYTE(a1),d0
		beq	.Auto_off
		move	#1,Jump_Auto_Flag(a3)
		move	d0,Jump_Auto_Height(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall
.Auto_off		clr	Jump_Auto_Flag(a3)
		clr	Jump_Auto_Height(a3)
		clr	Jump_Y_Acc(a3)
		clr	Jump_Auto_Timer(a3)
		move	#-1,Jump_Flame_Flag(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; =====================
		; BESCHLEUNIGUNG SETZEN
		; =====================

.Acc		move.b	BYTE(a1),d0
		ext	d0
		move	d0,Jump_Y_Acc(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ====================================
		; HABEN SIE FEUER? - ABER SICHER DOCH!
		; ====================================

.Fire		tst	Jump_Boost_Flag(a3)
		bne	.Fall
		move.b	BYTE(a1),d0
		ext	d0
		move	d0,Jump_Flame_Flag(a3)
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ==================================
		; GEGNER BEREITET SICH VOR (OBACHT!)
		; ==================================

		;Gegner bewegt sich nach Tabelle
.Table		tst	Jump_Move_Flag(a3)
		bne	.Move_Init_Ok
		moveq	#0,d0
		move.b	2*BYTE(a1),d0
		move	d0,Jump_Move_Timer(a3)
		move	#1,Jump_Move_Flag(a3)
		clr	Jump_Move_Offset(a3)
.Move_Init_Ok	lea	Move_Tabelle_List,a0
		moveq	#0,d0
		move.b	1*BYTE(a1),d0
		lsl	#2,d0
		add.l	(a0,d0.w),a0
		add	Jump_Move_Offset(a3),a0
		move.b	(a0),d0
		bpl	.Level_Ok2
		clr	Jump_Move_Offset(a3)
		tst	Jump_Boost_Flag(a3)
		bne	.Keine_Kollision
		subq	#1,Jump_Move_Timer(a3)
		bne	.Move_Init_Ok
		clr	Jump_Move_Flag(a3)
		addq	#3*BYTE,Jump_Offset(a3)
		bra	.Keine_Kollision
.Level_Ok2	tst	d0
		beq	.Sound
		cmp	#16,d0
		bne	.No_Sound
.Sound		move.l	d0,-(sp)
		moveq	#26,d0
		jsr	TFMX+16
		move.l	(sp)+,d0
.No_Sound		move	d0,Jump_Move_Pos(a3)
		add	#LEVEL_MIN,d0
		move	d0,Jump_Level(a3)
		addq	#BYTE,Jump_Move_Offset(a3)
		bra	.Keine_Kollision

		; ========================
		; LOGIK BRANCHT
		; ========================

		;Offset lesen und interpretieren
.Branch		move.b	BYTE(a1),d0
		ext	d0
		add	d0,Jump_Offset(a3)
		bra	.Fall

		; ========================
		; GEGNER SCHLFT
		; ========================

		;Verzgerung abwarten
.Wait		tst	Jump_Timer(a3)
		bne	.Wait_aktiv
		moveq	#0,d0
		move.b	BYTE(a1),d0
		move	d0,Jump_Timer(a3)
		bra	.Fall
.Wait_aktiv	subq	#1,Jump_Timer(a3)
		bne	.Fall
		addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ========================
		; HYDRAULIK ARBEITET
		; ========================

		;Gewnschtes Level ansteuern
.Goto		moveq	#0,d0
		move.b	BYTE(a1),d0
		cmp	Jump_Level(a3),d0
		beq	.Target_reached
		bhi	.Stand_Up
.Sit_Down		subq	#1,Jump_Level(a3)
		addq	#1,Jump_Y_Position(a3)
		bra	.Fall
.Stand_Up		addq	#1,Jump_Level(a3)
		subq	#1,Jump_Y_Position(a3)
		bra	.Fall
.Target_reached	addq	#2*BYTE,Jump_Offset(a3)
		bra	.Fall

		; ========================
		; GEGNER FLLT
		; ========================

		;Geschwidkeit whrend Sprung verwalten
.Fall		tst	Jump_Jump_Flag(a3)
		beq	.No_Jump
		move	Jump_Y_Speed(a3),d0
		asr	#8,d0
		sub	d0,Jump_Y_Speed(a3)
		bne	.No_Jump
		clr	Jump_Jump_Flag(a3)

		;Horizontale Bewegung ermglichen
.No_Jump		tst	Jump_Moving_Flag(a3)
		beq	.Autopilot
		move	Jump_Moving_Target(a3),d1
		sub	Jump_Moving_Source(a3),d1
		asr	#1,d1
		add	Jump_Moving_Source(a3),d1
		move	Jump_Moving_Acc(a3),Jump_X_Acc(a3)
		bpl	.Move_Right
.Move_Left	cmp	Jump_X_Position(a3),d1
		blo	.Move_Left2
		tst	Jump_X_Acc(a3)
		bpl	.Move_Left2
		neg	Jump_X_Acc(a3)
.Move_Left2	move	Jump_Moving_Target(a3),d0
		move	d0,d1
		sub	Jump_X_Position(a3),d1
		bpl	.Left_Positiv
		neg	d1
.Left_Positiv	cmp	#32,d1
		bhi	.Autopilot
		move	Jump_Moving_Acc(a3),d2
		asr	#1,d2
		add	d2,Jump_X_Acc(a3)
		cmp	#16,d1
		bhi	.Autopilot
		move	Jump_Moving_Acc(a3),d2
		asr	#2,d2
		add	d2,Jump_X_Acc(a3)
		cmp	#2,d1
		bhi	.Autopilot
		move	d0,Jump_X_Position(a3)
.Move_off		clr	Jump_Moving_Flag(a3)
		clr	Jump_X_Acc(a3)
		clr	Jump_X_Speed(a3)
		bra	.Autopilot
.Move_Right	cmp	Jump_X_Position(a3),d1
		bhi	.Move_Right2
		tst	Jump_X_Acc(a3)
		bmi	.Move_Right2
		neg	Jump_X_Acc(a3)
.Move_Right2	bra	.Move_Left2

		; -=*> Autopilot <*=-
.Autopilot	tst	Jump_Auto_Timer(a3)
		beq	.No_Auto_Action
		move	#-256,Jump_Y_Acc(a3)
		move	#1,Jump_Flame_Force(a3)
		movem	Jump_X_Position(a3),d0/d1
		add	Jump_Auto_Height(a3),d1
		add	#116,d1
		jsr	Get_Block_Bits
		swap	d0
		and	#(1<<SCR_KOLLISION_BIT)!(1<<SCR_EFFECT_BIT),d0
		beq	.No_Auto
		clr	Jump_Auto_Timer(a3)
		bra	.No_Auto
.No_Auto_Action	tst	Jump_Auto_Flag(a3)
		beq	.No_Auto
		clr	Jump_Y_Acc(a3)
		movem	Jump_X_Position(a3),d0/d1
		add	Jump_Auto_Height(a3),d1
		add	#100,d1
		jsr	Get_Block_Bits
		swap	d0
		and	#(1<<SCR_KOLLISION_BIT)!(1<<SCR_EFFECT_BIT),d0
		beq	.No_Auto
		move	#1,Jump_Auto_Timer(a3)

		;Fliekommawerte berechnen
.No_Auto		move	Jump_X_Acc(a3),d0
		add	d0,Jump_X_Speed(a3)
		move	Jump_X_Speed(a3),d0
		add	d0,Jump_X_Float(a3)
		move.b	Jump_X_Float(a3),d0
		ext	d0
		add	d0,Jump_X_Position(a3)
		clr.b	Jump_X_Float(a3)
		move	Jump_Y_Acc(a3),d0
		add	Jump_Gravitation(a3),d0
		add	d0,Jump_Y_Speed(a3)
		move	Jump_Y_Speed(a3),d0
		add	d0,Jump_Y_Float(a3)
		move.b	Jump_Y_Float(a3),d0
		ext	d0
		add	d0,Jump_Y_Position(a3)
		clr.b	Jump_Y_Float(a3)

		;Beine auf Boden ???
		movem	Jump_X_Position(a3),d0/d1
		add	Jump_Level(a3),d1
		add	#32,d1
		move	d1,-(sp)
		jsr	Get_Block_Bits
		move	(sp)+,d1
		swap	d0
		btst	#SCR_KOLLISION_BIT,d0
		beq	.Keine_Kollision

		;Ja, also abfedern
		move	Jump_Y_Speed(a3),d0
		asr	#1,d0
		sub	d0,Jump_Y_Speed(a3)
		move	Jump_Level(a3),d0
		and	#%1111,d1
		sub	d1,d0
		cmp	#LEVEL_MIN,d0
		bhs	.Level_Ok
		cmp	#TASK_FALL,Jump_Task(a3)
		bne	.No_Wait_Ground
		addq	#BYTE,Jump_Offset(a3)
.No_Wait_Ground	clr	Jump_Y_Acc(a3)
		clr	Jump_Y_Speed(a3)
		clr	Jump_Y_Float(a3)
		sub	#LEVEL_MIN,d0
		neg	d0
		sub	d0,Jump_Y_Position(a3)
		moveq	#LEVEL_MIN,d0
.Level_Ok		move	d0,Jump_Level(a3)

		;Endgltige Position festlegen
.Keine_Kollision	movem	Jump_X_Position(a3),d0/d1
		sub	Jump_Move_Pos(a3),d1
		movem	d0/d1,Bob_X_Position(a4)

		;Explosionen ???
		tst	Jump_Boost_Flag(a3)
		beq	.No_Expl
		subq	#1,Jump_Boost_Timer(a3)
		bpl	.Keine_Flamme
		move.l	Jump_Boost_Zeiger(a3),a1
		moveq	#11,d0
		jsr	TFMX+16
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Jump_Boost_Timer(a3)
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Jump_Boost_Zeiger(a3)
		bra	.Enter_Flame

		;Neue Flammen ???
.No_Expl		subq	#1,Jump_Flame_Timer(a3)
		bpl	.Keine_Flamme
		move.l	Jump_Flame_Zeiger(a3),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Jump_Flame_Timer(a3)
		moveq	#0,d3
		move.b	(a1)+,d3
		lsl	#6,d3
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Jump_Flame_Zeiger(a3)

		;Ja, also eintragen
		tst	Jump_Flame_Force(a3)
		beq	.No_Force
		move	#1,Jump_Flame_Flag(a3)
		subq	#1,Jump_Flame_Force(a3)
		bne	.No_Force
		clr	Jump_Flame_Flag(a3)
.No_Force		tst	Jump_Flame_Flag(a3)
		bmi	.Keine_Flamme
.Enter_Flame	add	Bob_X_Position(a4),d0
		add	Bob_Y_Position(a4),d1
		lea	Flame1_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search	tst	Flame_Used(a1)
		bne	.Used
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	d3,Flame_Speed(a1)
		clr	Flame_Float(a1)
		move	#3,Flame_Timer(a1)
		moveq	#2,d0
		jsr	TFMX+16
		bra	.Keine_Flamme
.Used		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search

		;Handle Flammen
.Keine_Flamme	lea	Flame1_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Handle	tst	Flame_Used(a1)
		beq	.No_Flame
		tst	Jump_Boost_Flag(a3)
		beq	.No_Handle_Expl
		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#5,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
		bra	.No_Flame
.No_Handle_Expl	move	Flame_Speed(a1),d0
		add	d0,Flame_Float(a1)
		move.b	Flame_Float(a1),d0
		ext	d0
		add	d0,Flame_Y_Position(a1)
		clr.b	Flame_Float(a1)
		sub	#16,Flame_Speed(a1)
		bpl	.Speed_Ok
		clr	Flame_Speed(a1)
.Speed_Ok		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#8,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
.No_Flame		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Handle

		;Flimmern wenn getroffen
		tst	Jump_Hit_Timer(a3)
		beq	.Do_Display
		subq	#1,Jump_Hit_Timer(a3)
		move	Jump_Hit_Timer(a3),d0
		and	#1,d0
		beq	.Test_Nutz_Hit

		; ========================
		; GEGNER-SIGELS DARSTELLEN
		; ========================

.Do_Display	tst	Jump_Boost_Flag(a3)
		beq	.Normal_Display
		bsr	Display_Jump_Flame
		bsr	Display_Jump_Gegner
		bsr	Display_Jump_Add
		bra	.Test_Nutz_Hit
.Normal_Display	bsr	Display_Jump_Gegner
		bsr	Display_Jump_Flame
		bsr	Display_Jump_Add
.Test_Nutz_Hit	bsr	Display_Jump_Stach

		;Wurde Nutz getroffen ???
		tst	Jump_Hit_Timer(a3)
		bne	.Done
		move	Jump_Level(a3),d0
		add	#90-LEVEL_MIN,d0
		move	d0,Bob_Height(a4)
		move	#160,Bob_Width(a4)
		lea	WorkRam,a2
		moveq	#0,d0
		move.b	TEMET_ANZ_HitPoints(a2),d0
		move	d0,-(sp)
		jsr	Test_TEMET_Hit
		move	(sp)+,d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		bls	.No_Scream
		moveq	#23,d0
		jsr	TFMX+16

		;Exit ???
.No_Scream	tst	Jump_Exit_Timer(a3)
		beq	.No_Exit_Timer
		subq	#1,Jump_Exit_Timer(a3)
		bne	.No_Exit_Timer
		jmp	Quit_Game

		;Hat Nutz getroffen ???
.No_Exit_Timer	tst	Jump_Hit_Possible(a3)
		beq	.Done
		lea	WorkRam,a2
		jsr	KollTopBobTest
		tst	d7
		bmi	.Done
		moveq	#9,d0
		jsr	TFMX+16
		jsr	Make_Bump
		move	#2*50,Jump_Hit_Timer(a3)
		addq	#1,Jump_Hit_Zhler(a3)
		cmp	#HITS_JUMPER,Jump_Hit_Zhler(a3)
		blo	.Done
		move	#4*50,Jump_Exit_Timer(a3)
		move	#1,Jump_Boost_Flag(a3)
.Done		rts

; ==========================================================================
;
; Stacheln darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Stacheln
Display_Jump_Stach	move	Jump_Stachel_PosI(a3),d0
		move	d0,d1
		lsr	#1,d1
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Stachel_Sigel,a0
		add	#20,Bob_X_Position(a4)
		add	#5,Bob_Y_Position(a4)
		add	d0,Bob_X_Position(a4)
		add	d1,Bob_Y_Position(a4)
		movem.l	d0/d1/d3/a0,-(sp)
		jsr	Show_Simple_Mickey
		movem.l	(sp)+,d0/d1/d3/a0
		moveq	#1,d2
		add	#72,Bob_X_Position(a4)
		sub	d0,Bob_X_Position(a4)
		sub	d0,Bob_X_Position(a4)
		movem.l	d0/d1/d3/a0,-(sp)
		jsr	Show_Simple_Object
		movem.l	(sp)+,d0/d1/d3/a0
		add	d0,Bob_X_Position(a4)
		sub	d1,Bob_Y_Position(a4)
		sub	#20+72,Bob_X_Position(a4)
		sub	#5,Bob_Y_Position(a4)
		rts

; ==========================================================================
;
; Gegner darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Gegner
Display_Jump_Gegner	moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Simple_Mickey
		add	#80,Bob_X_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Simple_Object
		sub	#80,Bob_X_Position(a4)
		rts

; ==========================================================================
;
; Klappen/Fe darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Klappen
Display_Jump_Add	movem	Bob_X_Position(a4),d0/d1
		add	#20,Bob_X_Position(a4)
		add	#52,Bob_Y_Position(a4)
		move	Jump_Level(a3),d2
		sub	#LEVEL_MAX,d2
		neg	d2
		lsr	#2,d2
		sub	d2,Bob_Y_Position(a4)
		lsr	#1,d2
		sub	d2,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Klappe1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#71,Bob_X_Position(a4)
		add	#60,Bob_Y_Position(a4)
		move	Jump_Level(a3),d2
		sub	#LEVEL_MAX,d2
		neg	d2
		lsr	#2,d2
		sub	d2,Bob_Y_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Klappe2_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#117,Bob_X_Position(a4)
		add	#52,Bob_Y_Position(a4)
		move	Jump_Level(a3),d2
		sub	#LEVEL_MAX,d2
		neg	d2
		lsr	#2,d2
		sub	d2,Bob_Y_Position(a4)
		lsr	#1,d2
		add	d2,Bob_X_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Klappe1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Object
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)

		;Display Fe
		movem	Bob_X_Position(a4),d0/d1
		addq	#7,Bob_X_Position(a4)
		move	Jump_Level(a3),d2
		add	d2,Bob_Y_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Fu1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#64,Bob_X_Position(a4)
		move	Jump_Level(a3),d2
		add	d2,Bob_Y_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Fu2_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Mickey
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		add	#122,Bob_X_Position(a4)
		move	Jump_Level(a3),d2
		add	d2,Bob_Y_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Fu1_Sigel,a0
		movem	d0/d1,-(sp)
		jsr	Show_Simple_Object
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		rts

; ==========================================================================
;
; Flammen/Explosionen darstellen
;
; a4 = Zeiger auf Bob-Eintrag
;
; ==========================================================================

		;Display Flammen
Display_Jump_Flame	movem	Bob_X_Position(a4),d0/d1
		movem	d0/d1,-(sp)
		lea	Flame1_Struktur,a0
		moveq	#FLAME_MAX-1,d7
.Loop_Flame	tst	Flame_Used(a0)
		beq	.Unused
		movem	Flame_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a3,-(sp)
		tst	Jump_Boost_Flag(a3)
		beq	.Flame
		addq	#1,Flame_Frame(a0)
		and	#%11,Flame_Frame(a0)
		move	Flame_Frame(a0),d7
		add	#08,Bob_X_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Right
		sub	#16,Bob_X_Position(a4)
.Expl_Right	add	#08,Bob_Y_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Down
		sub	#16,Bob_Y_Position(a4)
.Expl_Down	move	Flame_Anim(a0),d7
		mulu	#10*BYTE,d7
		lea	Expl_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
		bra	.Ok
.Flame		eor	#1,Flame_Frame(a0)
		beq	.No_Interlace
		add	#22,Bob_Y_Position(a4)
.No_Interlace	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Flame_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
.Ok		movem.l	(sp)+,d7/a0-a3
.Unused		add	#FLAME_SIZEOF,a0
		dbf	d7,.Loop_Flame
		movem	(sp)+,d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		rts

; ==========================================================================
;
; Mickey-Bumper (Stachel-Gegner)
;
; ==========================================================================

Init_MiBumper	move.b	#-8,GBumper_Bump_Speed(a4)
		move.b	#10,GBumper_Bump_Time(a4)
		and	#$fff0,Bob_X_Position(a4)
		and	#$fff0,Bob_Y_Position(a4)
		subq.w	#8,Bob_Y_Position(a4)
		move.l	#Bumper_Rout_Gl,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,GBumper_Show_Rout(a4)
		move.l	#MiBumper_Work_Anm,GBumper_Work_Anim(a4)
		rts

; ==========================================================================
;
; Mickey-Bumper bei Wasser-Endgegner initialiseren
;
; ==========================================================================

Init_WMiBumper	move.b	#-8,GBumper_Bump_Speed(a4)
		move.b	#10,GBumper_Bump_Time(a4)
		and	#$fff0,Bob_X_Position(a4)
		and	#$fff0,Bob_Y_Position(a4)
		sub	#23,Bob_Y_Position(a4)
		move.l	#Bumper_Rout_Gl,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,GBumper_Show_Rout(a4)
		move.l	#WMiBumper_Work_Anm,GBumper_Work_Anim(a4)
		rts

; ==========================================================================
;
; TIMET - GUMMILIANE
;
; a0 = Zeiger auf Lianen-Struktur
;
; ==========================================================================

		;Zeiger auf Lianen-Struktur
		;und Anzahl der Punkte holen
Bewege_Liane	lea	Liane_Struktur,a0
		move	(a0)+,d7

		;Multiplikationsfaktoren fr Beschleunigung
		moveq	#BESCHLEUNIGUNG_HIN,d4
		moveq	#BESCHLEUNIGUNG_WEG,d5

		;Soll- und Ist-Gravitationen annhern
.Loop		move	Liane_Y_Gravitation_Ist(a0),d0
		cmp	Liane_Y_Gravitation_Soll(a0),d0
		beq	.Gravitation_Ok
		blt	.Gravitation_Add
.Gravitation_Sub	sub	#10,Liane_Y_Gravitation_Ist(a0)
		bra	.Gravitation_Ok
.Gravitation_Add	add	#10,Liane_Y_Gravitation_Ist(a0)

		;Um den Mittelpunkt zwischen zwei Punkten
		;bestimmen zu knnen, mu der erste und der
		;letzte Punkt ausgelassen werden.
.Gravitation_Ok	tst	Liane_Begrenzung(a0)
		beq	.Nchster_Punkt
		tst	Liane_Begrenzung(a0)
		bmi	.Nchster_Punkt

		;Der nchste Bezugspunkt des letzten Punktes
		;hat die gleichen Koordinaten, wie der vorhergehende!
		tst	Liane_Begrenzung+LIANE_ENTRY_LENGTH(a0)
		bne	.Normaler_Punkt
		move	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),Liane_X_Position+LIANE_ENTRY_LENGTH(a0)
		move	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),Liane_Y_Position+LIANE_ENTRY_LENGTH(a0)

		;Mittelpunkt zwischen vorherigem und
		;nachfolgendem Punkt berechnen
.Normaler_Punkt	move	Liane_X_Position+LIANE_ENTRY_LENGTH(a0),d0
		sub	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),d0
		asr	#1,d0
		add	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),d0
		move	Liane_Y_Position+LIANE_ENTRY_LENGTH(a0),d1
		sub	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),d1
		asr	#1,d1
		add	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),d1

		;X/Y-Abstand der benachbarten Punkte berechnen
		moveq	#0,d2
		move	Liane_X_Position+LIANE_ENTRY_LENGTH(a0),d2
		sub	Liane_X_Position-LIANE_ENTRY_LENGTH(a0),d2
		bpl	.Abstand_X_Ok
		neg	d2
.Abstand_X_Ok	lsr	#3,d2
		bne	.Abstand_X_Ok2
		moveq	#1,d2
.Abstand_X_Ok2	moveq	#0,d3
		move	Liane_Y_Position+LIANE_ENTRY_LENGTH(a0),d3
		sub	Liane_Y_Position-LIANE_ENTRY_LENGTH(a0),d3
		bpl	.Abstand_Y_Ok
		neg	d3
.Abstand_Y_Ok	lsr	#3,d3
		bne	.Berechne_Abstand
		moveq	#1,d3

		;Horizontalen und vertikalen Abstand
		;zwischen Ist- und Soll-Punkt berechnen
.Berechne_Abstand	sub	Liane_X_Position(a0),d0
		sub	Liane_Y_Position(a0),d1

		;Bestimme horizontale Beschleunigung
.Acceleration_X	tst	d0
		bpl	.Test_Acc_X
		tst	Liane_X_Geschwindigkeit(a0)
		bmi	.Hin_X
		muls	d5,d0
		muls	d3,d0
		bra	.Acceleration_Y
.Test_Acc_X	tst	Liane_X_Geschwindigkeit(a0)
		bpl	.Hin_X
		muls	d5,d0
		muls	d3,d0
		bra	.Acceleration_Y
.Hin_X		muls	d4,d0
		muls	d3,d0

		;Bestimme vertikale Beschleunigung
.Acceleration_Y	tst	d1
		bpl	.Test_Acc_Y
		tst	Liane_Y_Geschwindigkeit(a0)
		bmi	.Hin_Y
		muls	d5,d1
		muls	d2,d1
		bra	.Acceleration_Y_Ok
.Test_Acc_Y	tst	Liane_Y_Geschwindigkeit(a0)
		bpl	.Hin_Y
		muls	d5,d1
		muls	d2,d1
		bra	.Acceleration_Y_Ok
.Hin_Y		muls	d4,d1
		muls	d2,d1

		;Setze neue Beschleunigung
.Acceleration_Y_Ok	add	Liane_X_Gravitation(a0),d0
		move	d0,Liane_X_Beschleunigung(a0)
		add	Liane_Y_Gravitation_Ist(a0),d1
		move	d1,Liane_Y_Beschleunigung(a0)

		;Beschleunigung auf Geschwindigkeit aufaddieren
		move	Liane_X_Beschleunigung(a0),d0
		add	d0,Liane_X_Geschwindigkeit(a0)
		move	Liane_Y_Beschleunigung(a0),d0
		add	d0,Liane_Y_Geschwindigkeit(a0)

		;Endgltige Fliekommawerte bestimmen
.Beschleunigung_Y	move	Liane_X_Geschwindigkeit(a0),d0
		add	d0,Liane_X_Float(a0)
		move	Liane_Y_Geschwindigkeit(a0),d0
		add	d0,Liane_Y_Float(a0)

		;Schleife ber alle Punkte der Liane
.Nchster_Punkt	add	#LIANE_ENTRY_LENGTH,a0
		dbf	d7,.Loop

		;Zeiger auf Lianen-Struktur und
		;Anzahl der Punkte holen
		lea	Liane_Struktur,a0
		move	(a0)+,d7

.Loop_Position	move.b	Liane_X_Float(a0),d0
		ext	d0
		add	d0,Liane_X_Position(a0)
		clr.b	Liane_X_Float(a0)
		move.b	Liane_Y_Float(a0),d0
		ext	d0
		add	d0,Liane_Y_Position(a0)
		clr.b	Liane_Y_Float(a0)

		;Schleife ber alle Punkte der Liane
		add	#LIANE_ENTRY_LENGTH,a0
		dbf	d7,.Loop_Position

		;und zurck
		rts

; ==========================================================================
;
; Gegner2_Routine
;
; ==========================================================================

Gegner2_Init	lea	Liane_Struktur,a0
		move	#VARIABLEN_SIZEOF-Liane_Struktur-1,d0
.Loop		clr.b	(a0)+
		dbf	d0,.Loop
		lea	Liane_Struktur,a0
		lea	Liane_Default,a1
		move	(a1)+,d0
		move	d0,(a0)+
		addq	#1,d0
		mulu	#LIANE_ENTRY_LENGTH,d0
		lsr	#1,d0
		subq	#1,d0
.Loop_Define	move	(a1)+,(a0)+
		dbf	d0,.Loop_Define
		lea	Gummi_Struktur,a0
		move	#1,Gummi_Left_Flag(a0)
		move	#240,Gummi_Saug_Min(a0)
		move	#780,Gummi_Saug_Max(a0)
		lea	Flame_Table_Start,a1
		move.l	a1,Gummi_Flame_Zeiger(a0)
		lea	Expl_Table_Gummi,a1
		move.l	a1,Gummi_Boost_Zeiger(a0)
		lea	Gegner2_Routine,a0
		move.l	a0,Bob_Routine(a4)
		move	#1300,WaterBase(a6)
		rts

; ==========================================================================
;
; EDGAR MIT DEN SAUGNPFEN
;
; a4 = Zeiger auf Eintrag in der Bob-Struktur
;
; ==========================================================================

		;Handle Saugnpfe
Gegner2_Routine	lea	Gummi_Struktur,a0
		lea	WorkRam,a3
		lea	Saugnapf_PosTab,a1
		lea	Liane_Struktur+0*LIANE_ENTRY_LENGTH+WORD,a2
		moveq	#Gummi_Left_Timer,d2
		bsr	Saugnapf_setzen
		lea	Saugnapf_PosTab,a1
		lea	Liane_Struktur+8*LIANE_ENTRY_LENGTH+WORD,a2
		moveq	#Gummi_Right_Timer,d2
		bsr	Saugnapf_setzen

		;Handle Flammen
.Handle_Flammen	lea	Flame_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Handle	tst	Flame_Used(a1)
		beq	.No_Flame
		cmp	#2,Gummi_Boost_Flag(a0)
		bne	.No_Expl
		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#5,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
		bra	.No_Flame
.No_Expl		move	Flame_Speed(a1),d0
		add	d0,Flame_Float(a1)
		move.b	Flame_Float(a1),d0
		ext	d0
		add	d0,Flame_Y_Position(a1)
		clr.b	Flame_Float(a1)
		sub	#16,Flame_Speed(a1)
		bpl	.Speed_Ok
		clr	Flame_Speed(a1)
.Speed_Ok		subq	#1,Flame_Timer(a1)
		bpl	.No_Flame
		move	#3,Flame_Timer(a1)
		addq	#1,Flame_Anim(a1)
		cmp	#8,Flame_Anim(a1)
		blo	.No_Flame
		clr	Flame_Used(a1)
.No_Flame		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Handle

		;Taktik frs Feuer geben
		subq	#1,Gummi_Grav_Timer(a0)
		bpl	.Beibehalten
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		bhs	.Loslassen
		tst	Gummi_Grav_Flag(a0)
		beq	.Feuer_geben
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*4+WORD,a1
		tst	Gummi_Hit_Timer(a0)
		bne	.Loslassen
		cmp	#300,Liane_Y_Position(a1)
		blo	.Feuer_geben
.Loslassen	clr	Gummi_Grav_Flag(a0)
		move	#2*50+25,Gummi_Grav_Timer(a0)
		bra	.Beibehalten
.Feuer_geben	clr	Open_Door_But(a6)
		move	#1,Gummi_Grav_Flag(a0)
		lea	Flame_TimeTab,a1
		move	Gummi_Flame_Offset(a0),d0
		move	(a1,d0.w),d1
		bpl	.FlameTime_Ok
		clr	Gummi_Flame_Offset(a0)
		bra	.Feuer_geben
.FlameTime_Ok	addq	#WORD,Gummi_Flame_Offset(a0)
		move	d1,Gummi_Grav_Timer(a0)

		;Gravitation setzen
.Beibehalten	tst	Gummi_Boost_Flag(a0)
		bne	.Keine_Flamme
		lea	Liane_Struktur,a1
		move	(a1)+,d0
		tst	Gummi_Grav_Flag(a0)
		beq	.Keine_Gravitation
		lea	Gravitation_Tabelle,a2
.Volle_Gravitation	move	(a2)+,Liane_Y_Gravitation_Soll(a1)
		add	#LIANE_ENTRY_LENGTH,a1
		dbf	d0,.Volle_Gravitation
		bra	.Add_Flammen
.Keine_Gravitation	clr	Liane_Y_Gravitation_Ist(a1)
		clr	Liane_Y_Gravitation_Soll(a1)
		add	#LIANE_ENTRY_LENGTH,a1
		dbf	d0,.Keine_Gravitation
		bra	.Keine_Flamme

		;Neue Flammen ???
.Add_Flammen	subq	#1,Gummi_Flame_Timer(a0)
		bpl	.Keine_Flamme
		move.l	Gummi_Flame_Zeiger(a0),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Gummi_Flame_Timer(a0)
		moveq	#0,d3
		move.b	(a1)+,d3
		lsl	#6,d3
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Gummi_Flame_Zeiger(a0)

		;Ja, also eintragen
		lea	Liane_Struktur+4*LIANE_ENTRY_LENGTH+WORD,a1
		add	Liane_X_Position(a1),d0
		sub	#64,d0
		add	Liane_Y_Position(a1),d1
		lea	Flame_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search	tst	Flame_Used(a1)
		bne	.Used
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	d3,Flame_Speed(a1)
		clr	Flame_Float(a1)
		move	#3,Flame_Timer(a1)
		moveq	#2,d0
		jsr	TFMX+16
		bra	.Keine_Flamme
.Used		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search

		;Boost-Sequenz ???
.Keine_Flamme	lea	Gummi_Struktur,a0
		move	Gummi_Boost_Flag(a0),d0
		beq	.Do_Liane
		subq	#1,d0
		beq	.Init_Boost

		;Gegner hngt schon scwer in den
		;Seilen -> Explosionen eintragen
.Enter_Expl	subq	#1,Gummi_Boost_Timer(a0)
		bpl	.Do_Liane
		move.l	Gummi_Boost_Zeiger(a0),a1
		moveq	#0,d0
		move.b	(a1)+,d0
		moveq	#0,d1
		move.b	(a1)+,d1
		moveq	#0,d2
		move.b	(a1)+,d2
		move	d2,Gummi_Boost_Timer(a0)
		move.b	(a1),d2
		ext	d2
		ext.l	d2
		add.l	d2,Gummi_Boost_Zeiger(a0)
		lea	Liane_Struktur+4*LIANE_ENTRY_LENGTH+WORD,a1
		add	Liane_X_Position(a1),d0
		sub	#64,d0
		add	Liane_Y_Position(a1),d1
		lea	Flame_Struktur,a1
		moveq	#FLAME_MAX-1,d2
.Loop_Search2	tst	Flame_Used(a1)
		bne	.Used2
		move	#1,Flame_Used(a1)
		movem	d0/d1,Flame_X_Position(a1)
		clr	Flame_Anim(a1)
		move	#3,Flame_Timer(a1)
		moveq	#11,d0
		jsr	TFMX+16
		bra	.Do_Liane
.Used2		add	#FLAME_SIZEOF,a1
		dbf	d2,.Loop_Search2

		;Wenn Boost-Sequenz:
		;-Tren ffnen
		;-Gegner hngen lassen
.Init_Boost	move	#1,Open_Door_But(a6)
		lea	Liane_Struktur,a1
		move	(a1)+,d0
		lea	Gravitation_Tabelle,a2
		moveq	#0,d2
.Hngen_lassen	move	(a2)+,d1
		neg	d1
		move	d1,Liane_Y_Gravitation_Soll(a1)
		cmp	Liane_Y_Gravitation_Ist(a1),d1
		beq	.Ist_Soll_Ok
		moveq	#1,d2
.Ist_Soll_Ok	add	#LIANE_ENTRY_LENGTH,a1
		dbf	d0,.Hngen_lassen
		tst	d2
		bne	.Do_Liane
		move	#2,Gummi_Boost_Flag(a0)
		move	#4*50,Gummi_Exit_Timer(a0)

		;Liane bewegen und Position bertragen
.Do_Liane		bsr	Bewege_Liane
		lea	Liane_Struktur,a0
		add	#LIANE_ENTRY_LENGTH*4+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)

		;Endgegner von Nutz getroffen ???
		movem.l	d0-d7/a0-a5,-(sp)
		lea	Gummi_Struktur,a0
		tst	Gummi_Hit_Timer(a0)
		beq	.Test_Hit
		subq	#1,Gummi_Hit_Timer(a0)
		bra	.Hit_Ok
.Test_Hit		cmp	#500,Bob_Y_Position(a4)
		bhs	.Hit_Ok
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		bhs	.Hit_Ok
		lea	WorkRam,a2
		sub	#64,Bob_X_Position(a4)
		move	#160,Bob_Width(a4)
		move	#50,Bob_Height(a4)
		jsr	KollTopBobTest
		tst	d7
		bmi	.Nutz_No_Koll
		lea	Gummi_Struktur,a0
		clr	Gummi_Grav_Timer(a0)
		move	#1,Gummi_Grav_Flag(a0)
		move	#50*2,Gummi_Hit_Timer(a0)
		addq	#1,Gummi_Hit_Zhler(a0)
		jsr	Make_Bump
		moveq	#9,d0
		jsr	TFMX+16
.Nutz_No_Koll	add	#64,Bob_X_Position(a4)
.Hit_Ok		movem.l	(sp)+,d0-d7/a0-a5

		;Kollision der Objekte
		move	#890,d2
		cmp	Bob_Y_Position(a4),d2
		bhs	.Keine_Kollision
		move	d2,Bob_Y_Position(a4)
		sub	#2000,Liane_Y_Geschwindigkeit(a0)
		moveq	#3,d0
		jsr	TFMX+16

		;Gegner darstellen (>&<)
.Keine_Kollision	lea	Gummi_Struktur,a0
		move	Gummi_Hit_Timer(a0),d0
		beq	.Display_Gegner
		and	#%1,d0
		beq	.Test_Nutz_Hit
.Display_Gegner	moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Simple_Mickey
		add	#64,Bob_X_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jsr	Show_Simple_Object

		;Saugnapf I darstellen
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*0+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Saugnapf_Sigel,a0
		jsr	Show_Simple_Mickey

		;Ringe darstellen
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*1+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*2+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*3+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*5+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*6+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*7+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		move	#Tekkno_EnemyVRam/32,d3
		lea	Ring_Sigel,a0
		jsr	Show_Simple_Mickey

		;Saugnapf II darstellen
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*8+WORD,a0
		move	Liane_X_Position(a0),d0
		add	Liane_X_Offset(a0),d0
		move	d0,Bob_X_Position(a4)
		move	Liane_Y_Position(a0),d0
		add	Liane_Y_Offset(a0),d0
		move	d0,Bob_Y_Position(a4)
		moveq	#1,d2
		move	#Tekkno_EnemyVRam/32,d3
		lea	Saugnapf_Sigel,a0
		jsr	Show_Simple_Object

		;Wurde Nutz vom Gegner getroffen ???
.Test_Nutz_Hit	lea	Gummi_Struktur,a0
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		bhs	.Done
		tst	Gummi_Hit_Timer(a0)
		bne	.Done
		lea	Liane_Struktur+LIANE_ENTRY_LENGTH*4+WORD,a1
		movem	Liane_X_Position(a1),d1/d2
		sub	#64,d1
		movem	d1/d2,Bob_X_Position(a4)
		move	#160,Bob_Width(a4)
		move	#55,Bob_Height(a4)
		tst	Gummi_Grav_Flag(a0)
		beq	.Nicht_Gegner
		add	#16,Bob_Height(a4)
.Nicht_Gegner	lea	WorkRam,a2
		moveq	#0,d0
		move.b	TEMET_ANZ_HitPoints(a2),d0
		move	d0,-(sp)
		jsr	Test_TEMET_Hit
		move	(sp)+,d0
		cmp.b	TEMET_ANZ_HitPoints(a2),d0
		bls	.Done
		moveq	#23,d0
		jsr	TFMX+16
.Done		rts

; ==========================================================================
;
; Alle Flammen der Flame-Struktur darstellen
;
; ==========================================================================

		;Alle Flammen darstellen
Display_Flame	moveq	#NUM_GEGNER,d0
		jsr	Suche_Bob_Eintrag
		bmi	.Done
		lea	Gummi_Struktur,a1
		cmp	#2,Gummi_Boost_Flag(a1)
		bne	.No_Swap
		tst	Gummi_Exit_Timer(a1)
		beq	.No_Exit_Timer
		subq	#1,Gummi_Exit_Timer(a1)
		bne	.No_Exit_Timer
		jsr	Quit_Game
.No_Exit_Timer	lea	Display_Flame,a0
		jsr	Search_Mickey_Main
		cmp	#4,d0
		bne	.No_Swap
		move.l	-LONG(a5),-(sp)
		move.l	a0,-LONG(a5)
		move.l	(sp)+,(a5)
		bra	.Done
.No_Swap		lea	Flame_Struktur,a0
		moveq	#FLAME_MAX-1,d7
.Loop_Flame	tst	Flame_Used(a0)
		beq	.Unused
		movem	Flame_X_Position(a0),d0/d1
		movem	d0/d1,Bob_X_Position(a4)
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		movem.l	d7/a0-a1,-(sp)
		cmp	#2,Gummi_Boost_Flag(a1)
		bne	.Normal_Flames
		addq	#1,Flame_Frame(a0)
		and	#%11,Flame_Frame(a0)
		move	Flame_Frame(a0),d7
		add	#08,Bob_X_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Right
		sub	#16,Bob_X_Position(a4)
.Expl_Right	add	#08,Bob_Y_Position(a4)
		lsr	#1,d7
		bcc	.Expl_Down
		sub	#16,Bob_Y_Position(a4)
.Expl_Down	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Expl_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
		bra	.Ok
.Normal_Flames	eor	#1,Flame_Frame(a0)
		beq	.No_Interlace
		add	#22,Bob_Y_Position(a4)
.No_Interlace	move	Flame_Anim(a0),d7
		lsl	#4,d7
		lea	Flame_Sigel_List,a0
		add	d7,a0
		jsr	Show_Simple_Mickey
.Ok		movem.l	(sp)+,d7/a0-a1
.Unused		add	#FLAME_SIZEOF,a0
		dbf	d7,.Loop_Flame
.Done		rts

; ==========================================================================
;
; Saugnapf positionieren
;
; a0 = Zeiger auf Gummi-Struktur
; a1 = Zeiger auf Saugnapf-Positionen
; a2 = Zeiger auf Liane-Struktur
; a3 = Zeiger auf Work-Ram
; d2 = Offset auf Gummi-Struktur (L/R)
;
; ==========================================================================

		;Verzgerung abwarten
Saugnapf_setzen	tst	Gummi_Left_Timer(a0,d2.w)
		bmi	.Move
		subq	#1,Gummi_Left_Timer(a0,d2.w)
		bpl	.Done

		;Timet tracen
		move	Liane_Y_Position(a2),d0
		sub	#64,d0
		sub	TEMET_Y_Position(a3),d0
		move	d0,d1
		bpl	.Abstand_positiv
		neg	d1
.Abstand_positiv	cmp	#48,d1
		bls	.No_Trace
		tst	d0
		bmi	.Go_Down

		;Nutz oben
.Go_Up		move	Liane_Y_Position(a2),d0
		cmp	Gummi_Saug_Min(a0),d0
		bls	.No_Trace
		move	#-1,Gummi_Left_Flag(a0,d2.w)
		bra	.Move

		;Nutz unten
.Go_Down		move	Liane_Y_Position(a2),d0
		cmp	Gummi_Saug_Max(a0),d0
		blo	.Go_Down2
		cmp	#HITS_GUMMI,Gummi_Hit_Zhler(a0)
		blo	.No_Trace
		tst	Gummi_Boost_Flag(a0)
		bne	.No_Trace
		move	#1,Gummi_Boost_Flag(a0)
		bra	.No_Trace
.Go_Down2		move	#1,Gummi_Left_Flag(a0,d2.w)
		bra	.Move

		;Nutz in Range oder Min/Max
.No_Trace		lea	Saugnapf_DelayTab_1,a1
		cmp	#2,Gummi_Hit_Zhler(a0)
		blo	.DelayTab_Ok
		lea	Saugnapf_DelayTab_2,a1
		cmp	#4,Gummi_Hit_Zhler(a0)
		blo	.DelayTab_Ok
		lea	Saugnapf_DelayTab_3,a1
.DelayTab_Ok	add	Gummi_Saug_Offset(a0),a1
		move.b	(a1),d0
		bpl	.Time_Ok
		clr	Gummi_Saug_Offset(a0)
		bra	.No_Trace
.Time_Ok		addq	#BYTE,Gummi_Saug_Offset(a0)
		ext	d0
		move	d0,Gummi_Left_Timer(a0,d2.w)
		tst	Gummi_Left_Flag(a0,d2.w)
		bmi	.Done
		clr	Gummi_Left_Timer(a0,d2.w)
		bra	.Done

		;Saugnapf setzen
.Move		add	Gummi_Left_Offset(a0,d2.w),a1
		cmp.b	#$7f,(a1)
		bne	.No_End
		moveq	#10,d0
		jsr	TFMX+16
		clr	Gummi_Left_Offset(a0,d2.w)
		move	Gummi_Left_Flag(a0,d2.w),d0
		bra	.No_Trace
.No_End		cmp.b	#$7e,(a1)
		bne	.No_Pop
		moveq	#10,d0
		jsr	TFMX+16
		moveq	#2,d0
		bra	.Ok2
.No_Pop		move.b	(a1),d0
		ext	d0
.Ok2		cmp	#Gummi_Left_Timer,d2
		beq	.Add
		sub	d0,Liane_X_Position(a2)
		bra	.Ok
.Add		add	d0,Liane_X_Position(a2)
.Ok		addq	#1,Gummi_Left_Offset(a0,d2.w)
		tst	Gummi_Left_Flag(a0,d2.w)
		bpl	.Down
		subq	#3,Liane_Y_Position(a2)
		bra	.Done
.Down		addq	#3,Liane_Y_Position(a2)
.Done		rts

; ==========================================================================
;
; Show Mickey-Objekt
;
; ==========================================================================

Show_Mickey_Object
		moveq	#0,d2
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jmp	Show_Simple_Mickey

Show_Mickey_XObject
		move	#Tekkno_EnemyVRam/32,d3
		move.l	Bob_SigelInfo(a4),a0
		jmp	Show_Simple_Object

; ==========================================================================
;
; Spezielle Routinen fr die Buttons
;
; ==========================================================================

Init_GlMi_Button	and	#$fff0,Bob_Y_Position(a4)
		add	#6,Bob_Y_Position(a4)
		move.l	#Show_Mickey_Object,Button_Display(a4)
		move.l	#Gl_Button,Bob_Routine(a4)
		move.l	#MiButton_Press_Anim,Button_Work_Anim(a4)
		move.l	#Clear_MiButton_Flag,Button_Out_Rout(a4)
		rts

; ==========================================================================

Init_Button_1	move.l	#Press_Button_1,Button_Routine(a4)
		bra	Init_GlMi_Button
Init_Button_2	move.l	#Press_Button_2,Button_Routine(a4)
		bra	Init_GlMi_Button
Init_Button_3	move.l	#Press_Button_3,Button_Routine(a4)
		bra	Init_GlMi_Button

; ==========================================================================

Press_GlMi_Button	clr.b	Button_Working(a4)
		cmp	#%111,Gummi_Button_Bits(a0)
		bne	.Done
		move	#1,Open_Door_But(a6)
.Done		rts

; ==========================================================================

Press_Button_1	lea	Gummi_Struktur,a0
		or	#%001,Gummi_Button_Bits(a0)
		bra	Press_GlMi_Button
Press_Button_2	lea	Gummi_Struktur,a0
		or	#%010,Gummi_Button_Bits(a0)
		bra	Press_GlMi_Button
Press_Button_3	lea	Gummi_Struktur,a0
		or	#%100,Gummi_Button_Bits(a0)
		bra	Press_GlMi_Button

; ==========================================================================

Clear_MiButton_Flag
		lea	Gummi_Struktur,a0
		clr	Gummi_Button_Bits(a0)
		clr	Open_Door_But(a6)
		rts

; ==========================================================================
Mickey_DoorAnimTab	dc.l	Door_Anim_Norm,Door_Anim_Small,0
			dc.w	Tekkno_EnemyVRam/32

; ==========================================================================

Door_Init	move.l	#Mickey_DoorAnimTab,Door_Anims(a4)
		move.l	#Test_Init_Doors,Bob_Routine(a4)
		move.l	#Show_Mickey_Object,Door_Show_Rout(a4)
		rts

; ==========================================================================

		ENDC
